﻿#pragma once

#include <xy/ais/object.h>
#include <xy/geom/vec.h>

namespace xy
{

namespace ais
{

class point : public object
{
  public:
    /**
     * @brief 指针构造
     *
     * @param[in] p
     */
    explicit point(std::shared_ptr<geom::vec3> p);

    /**
     * @brief 获得点
     *
     * @return std::shared_ptr<geom::vec3>
     */
    std::shared_ptr<geom::vec3> pnt() const;

    /**
     * @brief 碰撞检测接口
     *
     * @param[in] msg
     * @return true
     * @return false
     */
    bool collision(msg_mouse *msg) override;

    /**
     * @brief 初始化消息
     *
     * @param[in] msg
     */
    void visit(msg_init *msg) override;

    /**
     * @brief 移动消息
     *
     * @param[in] msg
     */
    void visit(msg_move *msg) override;

  protected:
    std::shared_ptr<geom::vec3> m_point;
};

class point_auxiliary : public point
{
  public:
    /**
     * @brief 特殊构造
     *
     * @param[in] getter
     * @param[in] setter
     */
    point_auxiliary(std::function<geom::vec3()> getter, std::function<void(geom::vec3)> setter);

    /**
     * @brief 刷新消息
     *
     * @param[in] msg
     */
    void visit(msg_update *msg) override;

    /**
     * @brief 移动消息
     *
     * @param[in] msg
     */
    void visit(msg_move *msg) override;

  protected:
    std::function<geom::vec3()> m_getter;
    std::function<void(geom::vec3)> m_setter;
};

} // namespace ais

} // namespace xy
